package br.senai.sc.web.cidade.beans;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;

import org.jboss.seam.international.status.Messages;
import org.jboss.seam.international.status.builder.BundleKey;

import br.senai.sc.controller.crud.CidadeCRUD;
import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.Cidade;
import br.senai.sc.model.Estado;
import br.senai.sc.util.SystemConstants;

/**
 * @author Fernando Marquardt &lt;fernando.marquardt@sc.senai.br&gt;
 * @since 26/01/2012
 * @version $Id: CidadeBean.java 28 2012-03-07 20:48:20Z fernando.marquardt $
 */
@Named
@ViewScoped
public class CidadeBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private CidadeCRUD cidadeCRUD;

    @Inject
    private Messages messages;

    private Cidade cidade;

    private DataModel<Cidade> cidades;

    /**
     * Cria uma nova cidade par ser cadastrada.
     */
    public void cadastrarCidade() {
        cidade = new Cidade();
    }

    /**
     * Carrega a cidade selecionada na lista.
     */
    public void carregarCidade() {
        cidade = getCidades().getRowData();
    }

    /**
     * Salva os dados da cidade.
     */
    public void salvarCidade() {
        try {
        	cidades = null;
            cidade = cidadeCRUD.salvar(cidade);
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "cidades.cadastrar.sucesso"));
        } catch (BusinessException e) {}

    }

    /**
     * Remove uma cidade do sistema.
     */
    public void removerCidade() {

        try {
            cidadeCRUD.removerCidade(cidade);
            cidade = null;
            cidades = null;
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "cidades.remover.sucesso"));
        } catch (BusinessException e) {}
    }

    /**
     * Busca as cidades cadastradas no sistema.
     * 
     * @return Retorn as cidades encontradas.
     */
    public DataModel<Cidade> getCidades() {
    	
    	if(cidades == null) {
    		cidades = new ListDataModel<Cidade>(cidadeCRUD.findCidades());
    	}
        return cidades;
    }

    /**
     * Busca os estados que podem ser atribuidos à um cidade cadastrada.
     * 
     * @return Retorna os estados encontrados.
     */
    public List<Estado> getEstados() {
        return cidadeCRUD.findEstados();
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }
}